// src/utils/auth.js
// 使用 owner-b.xauat.edu.cn 作为基础 URL
const baseUrl = 'https://owner-b.xauat.edu.cn'

// 添加重定向标记，避免无限重定向循环
let isRedirecting = false;

// 添加认证请求节流机制
let lastAuthRequestTime = 0;
const AUTH_REQUEST_MIN_INTERVAL = 2000; // 2秒最小间隔

// auth.js 中修改 request 函数
export const request = async (url, options = {}) => {
  // 确保URL格式正确，使用完整的目标服务器地址
  const fullUrl = url.startsWith('/huayun-ai')
    ? url  // 保持相对路径，让Nginx代理处理
    : url.startsWith('https://')
      ? url
      : `/huayun-ai${url.startsWith('/') ? url : '/' + url}`;

  const defaultOptions = {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Accept': 'application/json, text/plain, */*',
      'Referer': 'https://owner-b.xauat.edu.cn/',
      'Origin': 'https://owner-b.xauat.edu.cn'
    }
  }


  const mergedOptions = {
    ...defaultOptions,
    ...options,
    headers: {
      ...defaultOptions.headers,
      ...options.headers
    }
  }

  // 如果有 token，添加到请求头（避免重复添加Bearer）
  const token = localStorage.getItem('accessToken')
  if (token) {
    let authHeader = token.startsWith('Bearer ') ? token : `Bearer ${token}`;

    // 检查是否有重复的 Bearer 前缀（调试用）
    if (authHeader.startsWith('Bearer Bearer ')) {
      console.warn('auth.js 中检测到重复的 Bearer 前缀，正在修复:', authHeader);
      authHeader = authHeader.replace('Bearer Bearer ', 'Bearer ');
    }

    mergedOptions.headers.Authorization = authHeader;
  }

  // 如果有body且是对象，自动序列化为JSON字符串
  if (mergedOptions.body && typeof mergedOptions.body === 'object' && !(mergedOptions.body instanceof FormData)) {
    mergedOptions.body = JSON.stringify(mergedOptions.body)
  }

  try {
    const response = await fetch(fullUrl, mergedOptions)

    if (!response.ok) {
      // 处理认证失败
      if (response.status === 401 || response.status === 403) {
        // 清除无效token
        localStorage.removeItem('accessToken')
        throw new Error('AUTH_EXPIRED');
      } else if (response.status === 406) {
        // 清除无效token
        localStorage.removeItem('accessToken')
        throw new Error('PERMISSION_DENIED');
      } else {
        // 尝试解析错误响应
        let errorMsg = `HTTP error! status: ${response.status}`;
        try {
          const errorData = await response.json();
          errorMsg = errorData.msg || errorMsg;
        } catch (e) {
          // 解析失败则使用默认错误信息
        }

        throw new Error(errorMsg);
      }
    }

    return await response.json()
  } catch (error) {
    console.error('Request failed:', error)
    throw error
  }
}

// 西安建筑科技大学私有化登陆接口（改进版）
export const getXauatLoginToken = async (code) => {
  // 添加请求节流机制
  const now = Date.now();
  if (now - lastAuthRequestTime < AUTH_REQUEST_MIN_INTERVAL) {
    console.warn('认证请求过于频繁，跳过本次请求');
    throw new Error('认证请求过于频繁');
  }
  lastAuthRequestTime = now;

  try {
    const response = await request('/huayun-ai/client/auth/oauth2/xauat', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Origin': 'https://owner-b.xauat.edu.cn',
        'Referer': 'https://owner-b.xauat.edu.cn/'
      },
      body: JSON.stringify({
        code: code,
        redirect_uri: 'https://aimobiles.xauat.edu.cn' // 确保与认证服务器配置一致
      })
    });

    console.log('getXauatLoginToken 响应:', response);
    return response;
  } catch (error) {
    console.error('getXauatLoginToken 错误:', error);
    // 认证失败时重置时间，以便后续重试
    lastAuthRequestTime = 0;
    throw new Error(`获取token失败: ${error.message}`);
  }
}

import { ref } from 'vue'

// 创建响应式 token
export const tokenRef = ref(localStorage.getItem('accessToken'))

// 设置 token 到 localStorage 并更新响应式引用
export const setToken = (token) => {
  const cleanToken = token.startsWith('Bearer ') ? token.substring(7) : token
  localStorage.setItem('accessToken', cleanToken)
  tokenRef.value = cleanToken  // 更新响应式值
}

// 获取 token（保持原有函数，也可直接用 tokenRef）
export const getToken = () => {
  return tokenRef.value  // 改为读取响应式值
}

// 清除 token
export const clearToken = () => {
  localStorage.removeItem('accessToken')
  tokenRef.value = null
}
